#include<cstdio>//BY:uncle-lu
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;

struct node{
	int l,r,size,key,val;
}tree[40000];
int add_line[30010];
int search_sit[30010];
int cnt,root,ans,n,m;

int push(int k) { return tree[tree[k].l].size+tree[tree[k].r].size+1; }

void lturn(int &k)
{
	int temp=tree[k].r;
	tree[k].r=tree[temp].l; tree[temp].l=k; tree[temp].size=tree[k].size; tree[k].size=push(k);
	k=temp;
	return ;
}

void rturn(int &k)
{
	int temp=tree[k].l;
	tree[k].l=tree[temp].r; tree[temp].r=k; tree[temp].size=tree[k].size; tree[k].size=push(k);
	k=temp;
	return ;
}

int treap_insert(int &k,int val)
{
	if(!k)
	{
		k=++cnt;
		tree[k].key=rand();
		tree[k].size=1;
		tree[k].val=val;
		return 0;
	}
	tree[k].size++;
	if(tree[k].val>=val)
	{
		treap_insert(tree[k].l,val);
		if(tree[tree[k].l].key<tree[k].key)rturn(k);
	}
	else 
	{
		treap_insert(tree[k].r,val);
		if(tree[tree[k].r].key<tree[k].key)lturn(k);
	}
	return 0;
}

int DFS(int k,int step)
{
	if(tree[tree[k].l].size+1==step)
	{
		ans=tree[k].val;
		return 0;
	}
	if(tree[tree[k].l].size<step)
	{
		DFS(tree[k].r,step-tree[tree[k].l].size-1);
	}
	else 
	{
		DFS(tree[k].l,step);
	}
	return 0;
}

int main()
{
	int sit=0,search_i=1;
	scanf("%d%d",&n,&m);
	srand(n);
	for(int i=1;i<=n;++i) { scanf("%d",&add_line[i]); }
	for(int i=1;i<=m;++i) { scanf("%d",&search_sit[i]); }
	for(int i=1;i<=n;++i)
	{
		treap_insert(root,add_line[i]);
		if(search_sit[search_i]==i)
		{
			while(search_sit[search_i]==i)
			{
				sit++;
				ans=0;
				DFS(root,sit);
				printf("%d\n",ans);
				search_i++;
			}
		}
	}
	return 0;
}